/****************************************************
 * A generic kernel FIFO implementation 
 * Copyright (C) 2018 Geno <gcs2508@163.com>
 *
 * 文件名称: ring_buffer.c
 * 参  考: linux/kernel/kfifo.c
 * 摘  要：环形缓冲区
 * 当前版本: 1.0
 * 作  者: Geno
 ****************************************************/
#ifndef __UTILS_FIFO_H__
#define __UTILS_FIFO_H__

#include <stdint.h>

typedef struct ring_buffer {
    uint8_t *buffer;            //the buffer holding the data
    uint16_t size;              //the size of the allocated buffer
    uint16_t _in;               //data is added at offset (in % size)
    uint16_t _out;              //data is extracted from off. (out % size)
}ring_buffer_t;

/**
 * @brief 创建循环Buffer
 * @param size [in] buffer 大小
 * @return buffer 实例化指针 
 ***/
ring_buffer_t * ring_buffer_create(uint16_t size);

/**
 * @brief 清空循环buffer
 * @param r [in] buffer的实例化指针 
 ***/
void ring_buffer_clr(ring_buffer_t *r);

/**
 * @brief 获得buffer的有效数据长度
 * @param r [in] buffer的实例化指针
 * @return 返回有效数据长度
 ***/
uint16_t ring_buffer_len(ring_buffer_t *r);

/**
 * @brief buffer 写数据
 * @param r [in] buffer的实例化指针
 * @param buf [in] 数据源地址
 * @param size [in] 数据长度
 * @return 写入的数据size
 */
uint16_t ring_buffer_put(ring_buffer_t *r,uint8_t *buf,uint16_t size);

/**
 * @brief buffer 读数据
 * @param r [in] buffer的实例化指针
 * @param buf [out] 数据目表地址
 * @param size [in] 数据读取的长度
 * @return 读取的数据size
 ***/
uint16_t ring_buffer_get(ring_buffer_t *r,uint8_t *buf,uint16_t size);

/**
 * @brief buffer 的销毁
 * @param r [in]  buffer的实例化指针
 ***/
void ring_buffer_destory(ring_buffer_t *r);

#endif //__UTILS_FIFO_H__
